package com.itheima.sc.service.ums;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ArrayUtil;
import com.itheima.sc.api.ums.*;
import com.itheima.sc.pojo.ums.*;
import com.itheima.sc.vo.PageResult;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class UmsRoleService {
    @DubboReference
    private UmsRoleApi umsRoleApi;
    @DubboReference
    private UmsMenuApi umsMenuApi;
    @DubboReference
    private UmsRoleMenuRelationApi umsRoleMenuRelationApi;
    @DubboReference
    private UmsRoleResourceRelationApi umsRoleResourceRelationApi;
    @DubboReference
    private UmsResourceApi umsResourceApi;

    /**
     * 添加角色
     */
    public void createRole(UmsRole umsRole) {
        umsRole.setCreateTime(new Date());
        //调用API保存数据
        umsRoleApi.createRole(umsRole);
    }

    /**
     * 修改角色
     */
    public void update(UmsRole umsRole) {
        //调用API修改数据
        umsRoleApi.update(umsRole);
    }

    /**
     * 删除角色
     */
    public void deleteByIds(Integer[] ids) {
        umsRoleApi.deleteByIds(ids);
    }

    /**
     * 获取所有角色
     */
    public List<UmsRole> listAll() {
        return umsRoleApi.listAll();
    }

    /**
     * 给角色分配菜单
     */
    public void allocMenu(Integer[] menuIds, Integer roleId) {
        //TODO 先将原始的数据清除
        umsRoleMenuRelationApi.deleteByRoleId(roleId);

        //再重新添加数据
        if (ArrayUtil.isNotEmpty(menuIds)) {
            //调用API保存数据
            for (Integer menuId : menuIds) {
                UmsRoleMenuRelation umsRoleMenuRelation = new UmsRoleMenuRelation();
                umsRoleMenuRelation.setMenuId(Convert.toLong(menuId));
                umsRoleMenuRelation.setRoleId(Convert.toLong(roleId));
                umsRoleMenuRelationApi.allocMenu(umsRoleMenuRelation);
            }
        }
    }

    /**
     * 给角色分配资源
     */
    public void allocResource(Integer[] resourceIds, Integer roleId) {
        //将原来的数据删除
        umsRoleResourceRelationApi.delete(roleId);
        //给角色分配资源
        if (ArrayUtil.isNotEmpty(resourceIds)) {
            //调用API保存数据
            for (Integer resourceId : resourceIds) {
                umsRoleApi.allocResource(resourceId, roleId);
            }
        }
    }

    /**
     * 根据角色名称分页获取角色列表
     */
    public PageResult list(Integer pageNum, Integer pageSize, String keyword) {
        //调用API查询数据
        return umsRoleApi.list(pageNum, pageSize, keyword);
    }

    /**
     * 获取角色相关菜单
     */
    public List<UmsMenu> listMenu(Integer roleId) {
        //根据roleId查询role_menu关系表
        List<UmsRoleMenuRelation> umsRoleMenuRelationList = umsRoleMenuRelationApi.roleMenuList(roleId);

        //创建返回值信息集合
        List<UmsMenu> umsMenuList = new ArrayList<>();
        if (CollUtil.isNotEmpty(umsRoleMenuRelationList)) {
            //如果结果不为空,遍历集合,获取所有menuId
            for (UmsRoleMenuRelation umsRoleMenuRelation : umsRoleMenuRelationList) {
                //调用API获取menu信息
                UmsMenu menuInfo = umsMenuApi.getMenuInfo(Convert.toInt(umsRoleMenuRelation.getMenuId()));
                //将查询到的信息添加进集合
                umsMenuList.add(menuInfo);
            }
        }
        return umsMenuList;
    }

    //通过用户的AdminId 查询role中的数据
    public List<UmsRole> selectByAdminId(Long adminId) {
        return umsRoleApi.selectByAdminId(adminId);
    }

    /**
     * 获取角色相关资源
     */
    public List<UmsResource> listResource(Integer roleId) {
        //根据roleId查询role_resource关系表
        List<UmsRoleResourceRelation> umsRoleResourceRelationList = umsRoleResourceRelationApi.roleResourceList(roleId);

        //创建返回值信息集合
        List<UmsResource> umsResourceList = new ArrayList<>();
        if (CollUtil.isNotEmpty(umsRoleResourceRelationList)) {
            //如果结果不为空,遍历集合,获取所有menuId
            for (UmsRoleResourceRelation umsRoleResourceRelation : umsRoleResourceRelationList) {
                //调用API获取resource信息
                UmsResource umsResource = umsResourceApi.getInfoById(Convert.toInt(umsRoleResourceRelation.getResourceId()));
                //将查询到的信息添加进集合
                umsResourceList.add(umsResource);
            }
        }
        return umsResourceList;
    }

    /**
     * 修改角色状态
     */
    public void updateStatus(Integer id, Integer status) {
        //调用API修改数据
        umsRoleApi.updateStatus(id, status);
    }


    /**
     * 根据角色表和用户角色的关系表获取用户的id
     * @param name
     * @return
     */
   /* public List<Long> getAdminId(String name) {
       return umsRoleApi.getAdminId(name);
    }*/
}
